#include <iostream>

using namespace std;

// 所有转换得到的都是引用类型的变量

// 最暴力的转换
void show_reinterpret_cast(){
	double a = 1.1;
	char * c = reinterpret_cast<char *>(&a);
	double * b = reinterpret_cast<double *>(c);
	printf("%lf", *b);
}

// const_cast 2个功能： 去掉和加上const 特别注意：const_cast转换之后的地址是不变的
void show_const_cast(){
	int * a = new int(10);
	const int * b = const_cast<const int *>(a);
	*a = 20;
	printf("%d, %d\n", *a, *b); // 这里输出的都是20，转换的时候地址并没有改变
	printf("addr: %p, %p\n", a, b); // 这里输出的都是20，转换的时候地址并没有改变
	
	int c = 20;
	const int * d = const_cast<int *>(&c);
	int * e = const_cast<int *>(d);
	*e = 30;
	printf("d:%d,e:%d\n", *d, *e);
	printf("d:%p,e:%p",d,e);
}

// 这种转换不用传递引用类型，简单转换，比如整数，浮点数，char类型的相互转换，相当于c语言的强制转换。
// 但是将整数等转换指针类型，肯定是不行的。
void show_static_cast(){
	int a = 10;
	double b = static_cast<double>(a);
	printf("%.2f\n", b);
	
	char c = 'a';
	int d = static_cast<int>(c);
	printf("%d\n", d);
	
	// 基类和派生类之间的相互转换 指针的方式转换
	// son * s = static_cast<father *>(f);
	// father * f = static_cast<son *>(s);
}

void show_dynamic_cast(){
	
	
}

int main(){
	// show_reinterpret_cast();
	// show_const_cast();
	show_static_cast();
	return 0;
}